package activitis;

import utils.BaseAsync;
import utils.Constantes;
import utils.FileHelper;
import utils.PreferencesHelper;

import com.example.rapichofer.R;
import com.google.android.gms.maps.CameraUpdate;
import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.MapFragment;
import com.google.android.gms.maps.model.BitmapDescriptorFactory;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.LatLngBounds;
import com.google.android.gms.maps.model.MarkerOptions;
import com.google.gson.Gson;

import controladores.ControladorTurnos;
import controladores.ControladorViajes;

import entidades.PuntoGeografico;
import entidades.Solicitud;
import entidades.Turno;
import entidades.Viaje;
import android.support.v7.app.ActionBarActivity;
import android.annotation.SuppressLint;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;

public class RespuestaViajeActivity extends ActionBarActivity  implements OnClickListener
{
	private Solicitud solicitud;
	
	private Viaje viaje;
	private GoogleMap googleMap;
	
	private LatLng origen;
	private LatLng destino;
	
	private LatLng chofer;
	
	TextView calificaciones;

	@Override
	@SuppressLint("NewApi")
	protected void onCreate(Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_respuesta_viaje);

//		((Button) findViewById(R.id.hybrid)).setOnClickListener(this);
//		((Button) findViewById(R.id.normal)).setOnClickListener(this);
		
		calificaciones = (TextView)findViewById(R.id.textViewCalificaciones);
		
		String v = this.getIntent().getStringExtra("solicitud");
		
		if (v != null)
		{
			solicitud = new Gson().fromJson(v, Solicitud.class);
			viaje = solicitud.getViaje();
			
			calificaciones.setText(solicitud.getCalificaciones()[0]+"-"+solicitud.getCalificaciones()[2]);
			try
			{
				if (googleMap == null)
				{
					googleMap = ((MapFragment) getFragmentManager()
							.findFragmentById(R.id.map)).getMap();
					googleMap.setPadding(0, 140, 0, 100);
				}
				
				origen = getLatLng(viaje.getPuntos().get(0));
				googleMap.setMapType(GoogleMap.MAP_TYPE_HYBRID);
				
				// Move the camera instantly to hamburg with a zoom of 15.
//				googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(origen, 15));
				
				googleMap.addMarker(new MarkerOptions().position(
                    origen).title(
                    viaje.getPuntos().get(0).getDireccion()));
				
				if (viaje.getPuntos().size() > 1)
				{
					destino = getLatLng(viaje.getPuntos().get(1));
					
					MarkerOptions options = new MarkerOptions()
						.position(destino)
						.title(viaje.getPuntos().get(1).getDireccion())
						.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_AZURE));

					googleMap.addMarker(options);
				}
				else
				{
					findViewById(R.id.botonDestino).setEnabled(false);
					//findViewById(R.id.botonVer).setVisibility(View.INVISIBLE);
				}

				// Zoom in, animating the camera.
//				googleMap.animateCamera(CameraUpdateFactory.zoomTo(17), 2000,
//						null);
				
				pointZoom(origen);
				
				

			} catch (Exception e)
			{
				e.printStackTrace();
			}

		} else
			Log.i("LOG", "fue null!");

	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu)
	{
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.respuesta_viaje, menu);
		return true;
	}

	@Override
	public boolean onOptionsItemSelected(MenuItem item)
	{
		// Handle action bar item clicks here. The action bar will
		// automatically handle clicks on the Home/Up button, so long
		// as you specify a parent activity in AndroidManifest.xml.
		int id = item.getItemId();
		if (id == R.id.action_settings)
		{
			return true;
		}
		return super.onOptionsItemSelected(item);
	}
	
	@Override
	protected void onResume()
	{
		super.onResume();
		
		new BuscarTurno().execute();
	}

	public void aceptar(View view)
	{
		new Aceptar().execute();
	}

	public void rechazar(View view)
	{
		new RechazarViaje().execute();
	}
	
	public void zoomAll (View view)
	{
		LatLngBounds.Builder builder = new LatLngBounds.Builder();
		builder.include(origen);
		
		if (destino != null)
			builder.include(destino);
		
		if (chofer != null)
			builder.include(chofer);
		
		LatLngBounds bounds = builder.build();
		
		int padding = 0; // offset from edges of the map in pixels
		CameraUpdate cu = CameraUpdateFactory.newLatLngBounds(bounds, padding);
		googleMap.animateCamera(cu);
		//googleMap.animateCamera(CameraUpdateFactory.zoomTo(googleMap.getCameraPosition().zoom - 1), 2000, null);
	}
	
	public void zoom (View view)
	{
		LatLng point;
		
		switch (view.getId())
		{
		case R.id.botonOrigen:
			point = origen;
			break;
		case R.id.botonDestino:
			point = destino;
			break;
		default:
			point = chofer;
		}
		
		if (point != null)
			pointZoom(point);
	}
	
	private void pointZoom (LatLng point)
	{
		//googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(point, 15));
		googleMap.animateCamera(CameraUpdateFactory.newLatLngZoom(point, 17), 2000, null);
		//googleMap.animateCamera(CameraUpdateFactory.zoomTo(17), 2000, null);
	}
	
	private class Aceptar extends BaseAsync
	{
		private Viaje res;
		
		public Aceptar ()
		{
			super (RespuestaViajeActivity.this, "Espere por favor...");
		}

		@Override
		protected Void doInBackground(Void... params)
		{
			ControladorViajes con = new ControladorViajes ();
			
			res = con.aceptarViaje(new PreferencesHelper(getApplicationContext()).leerID(), viaje.getId());
			return null;
			
		}
		
		@Override
		protected void onPostExecute(Void result)
		{
			super.onPostExecute(result);
			
			if (res != null)
			{
				Intent intent = new Intent(RespuestaViajeActivity.this, InfoViajeActivity.class);
				startActivity(intent);
				super.onPostExecute(result);
				finish();
			}
			else
				alert();
		}
		
		private void alert ()
		{
			AlertDialog.Builder alert = new AlertDialog.Builder(RespuestaViajeActivity.this);
			alert.setTitle("Error");
			alert.setMessage("Fallo, probablemente timeout!");
			alert.setPositiveButton("Aceptar",
					new DialogInterface.OnClickListener()
					{
						public void onClick(DialogInterface dialog, int whichButton)
						{
							finish();
						}
					});
			alert.show();
		}
	}
	
	@Override
	public void onClick(View v)
	{
		switch (v.getId())
		{
		case R.id.hybrid:
			googleMap.setMapType(GoogleMap.MAP_TYPE_HYBRID);
			break;
		case R.id.terrain:
			googleMap.setMapType(GoogleMap.MAP_TYPE_TERRAIN);
			break;
		case R.id.none:
			googleMap.setMapType(GoogleMap.MAP_TYPE_NONE);
			break;
		case R.id.normal:
			googleMap.setMapType(GoogleMap.MAP_TYPE_NORMAL);
			break;
		case R.id.satellite:
			googleMap.setMapType(GoogleMap.MAP_TYPE_SATELLITE);
			break;

		default:
			break;
		}
	}
	
	public void tipoMapa (View view)
	{
		switch (googleMap.getMapType())
		{
		case GoogleMap.MAP_TYPE_HYBRID:
			googleMap.setMapType(GoogleMap.MAP_TYPE_NORMAL);
			break;
		case GoogleMap.MAP_TYPE_NORMAL:
			googleMap.setMapType(GoogleMap.MAP_TYPE_HYBRID);
			break;
		}
	}
	
	private LatLng getLatLng (PuntoGeografico punto)
	{
		return new LatLng(punto.getLatitud(), punto.getLongitud());
	}
	
	private class BuscarTurno extends BaseAsync
	{
		private PuntoGeografico punto;
		
		public BuscarTurno ()
		{
			super (RespuestaViajeActivity.this, "Cargando...");
		}

		@Override
		protected Void doInBackground(Void... params)
		{
			Turno turno = new ControladorTurnos().getTurno(new PreferencesHelper(getApplicationContext()).leerID());
			
			if (turno != null)
				punto = turno.getChofer().getUbicacion();
			
			return null;
		}
		
		@Override
		protected void onPostExecute(Void result)
		{
			super.onPostExecute(result);
			
			if (punto != null)
			{
				chofer = getLatLng(punto);
				MarkerOptions options = new MarkerOptions()
					.position(chofer)
				 	.icon(BitmapDescriptorFactory.fromResource(R.drawable.ic_mapa_chofer))
				 	.title("Usted");

				googleMap.addMarker(options);
			}
		}
	}
	
	private class RechazarViaje extends BaseAsync
	{
		public RechazarViaje ()
		{
			super (RespuestaViajeActivity.this, "Rechazando...");
		}
		
		@Override
		protected Void doInBackground(Void... arg0)
		{
			new ControladorViajes().rechazarViaje(new PreferencesHelper(getApplicationContext()).leerID(), viaje.getId());
			
			return null;
		}
		
		@Override
		protected void onPostExecute(Void result)
		{
			super.onPostExecute(result);
			
			finish();
		}
	}
}
